package com.itheima.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
//安全校验功能

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {

    private AntPathMatcher matcher = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 2、判断当前请求的资源要不要放行： 静态资源全部 + 登录和退出 的都需要放行！！  放行后直接 retrurn;
// 2.1 获取请求的uri地址
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String uri = req.getRequestURI();

// 2.2 配置需要放行的地址【静态资源全部放 + 登录和退出的】：
        String[] loginUrls = {
                "/employee/login",
                "/employee/logout",
                "/user/login",
                "/user/sendMsg",
                "/backend/**",
                "/front/**"};


//  /backend/**   匹配   uri:   /backend/index.html
// url风格的匹配 ，需要用到一个类  AntPathMatcher antPathMatcher = new AntPathMatcher();  match方法
        // 判断 uri地址 是否 匹配 loginUrls其中之一
        for (String loginUrl : loginUrls) {
            //match 需要放行的 地址 ,和 需要请求的路径地址
            boolean match = matcher.match(loginUrl, uri);

            if (match) {
                // 固定格式(放行)
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }
        }

// 3、不是登录相关的，判断是否登录，判断的依据是什么： session中是否有用户的id。
        Object employee = req.getSession().getAttribute("employee");

// 3.1、有：则是已经登录，需要放行
        if (employee != null) {
            // 固定格式(放行)
            BaseContext.setCurrentId((Long) employee);
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        //4-2、判断登录状态，如果已登录，则直接放行
        Object user = req.getSession().getAttribute("user");
        if(user != null){
            BaseContext.setCurrentId((Long) user);
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }

// 3.2 没有：则是非法访问，返回错误信息： {"data": null ,"code": 0 ,"msg": "NOTLOGIN"}
// 提示信息:   R.error("NOTLOGIN");
        R<Object> notlofin = R.error("NOTLOGIN");
// 转成json: JSON.toJSONString ，响应给前端  response.getWriter();
        String s = JSON.toJSONString(notlofin);
        servletResponse.getWriter().write(s);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
